/*
 * BitFileManager.h
 *
 *  Created on: May 24, 2012
 *      Author: Nico
 */

/* abstract */ class BitFileManager{
	protected:
	
		unsigned char buffer;
		short amountLastBitsReaded;
		
	public:
		bool completeToByte;
		bool clearBuffer;
		bool completeToByteLastChar;
		
		// Muestra debugs por pantalla
		bool debug;
	
};

class OBitFileManager : public BitFileManager{
	
	protected:
		char* outputFilename;
		ofstream* output;
				
		bool rellenoAplicado; // Indica si se completo a bytes con 1 y 0
		int completarConUnoYceros();
	
	public:
		OBitFileManager(const char* outputFilename);
		~OBitFileManager();

		/*
		 * Estos metodos son 'semipublicos', hay que usarlos con cuidado
		 * seteando correctamente los atributos booleanos. Recomiendo 
		 * usar los 'metodos seguros' definidos mas abajo.
		 */
		int writeBinaryFileFromBinaryRepresentationString(const char* binaryRepresentationString );
		int writeBinaryFileFromTextString(const char* textString);
		
		
		
		/* Metodos seguros */
		
		// El parametro es un string de la forma "100110101001", osea, solo
		// caracteres '1' y '0' que representan un binario de algo.
		int writeBinaryString(const char* binaryString);
		int writeBinaryString(const string* binaryString);
		
		// El parametro es un string normal, una cadena de chars.
		int writeText(const char* textString);
		int writeText(const string* textString);
		

};

class IBitFileManager : public BitFileManager{
	protected:
		char* inputFilename;
		ifstream* input;
		
		// Tamanio con el que voy a leer el archivo. No tiene nada
		// que ver con el blockSize usado en compresion.
		uInt blockSize; 
		
		// Texto que voy leyendo del archivo
		uChar* textBlock;
		
		uChar* blockIterator;
		
		uChar getBit(uChar* buffer , uInt bitNumber);
		
	public:
		IBitFileManager(const char* inputFilename);
		~IBitFileManager();
		
		int getNextBit(uChar* bit); // Devuelve '1' o '0'
		int getNextBits(const uInt amount, string* bits); // Devuelve '1' o '0'
		int getNextByte(uChar* byte); // Devuelve un hexa, 8 bits
		int getNextBytes(const uInt amount, string* bytes);

		
		void rewind();
};
